Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.05.2014, 00:27
Новичок на форуме
Отправить личное сообщение для silentHill Посмотреть профиль Найти все сообщения от silentHill
 
Регистрация: 28.05.2014
Сообщений: 4

Помогите разобраться...
Доброго времени суток!
Хотел сегодня написать простейший пример с использованием Ajax, и вот уже 4 часа не могу разобраться:
Страничка у меня вот такая:
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>
<body>
    <button onclick="vote(this)">Голосовать!</button>
    <script>
        function vote(outputElem) {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'proj1.js', true);
            xhr.onreadystatechange = function () {
                if (xhr.readyState != 4) return;
                if (xhr.status != 200) {
                    alert('Ошибка ' + xhr.status + ': ' + xhr.statusText);
                    return;
                }
                outputElem.innerHTML = xhr.responseText;
            }
            xhr.send(null);
        }
</script>
</body>
</html>


Файл сервера:
var http = require('http');

http.createServer(function (req, res) {
		res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
		var now = new Date();
		var timeStr = now.getHours()+':'+now.getMinutes()+':'+now.getSeconds();
		res.end('Голос принят ' + timeStr);
		return;
}).listen(8080);


Почему нет результата?
Оба файла находятся в одной папке...(запускаю локально).
Ответить с цитированием
  #2 (permalink)  
Старый 28.05.2014, 00:45
Новичок на форуме
Отправить личное сообщение для Borys Semerenko Посмотреть профиль Найти все сообщения от Borys Semerenko
 
Регистрация: 28.05.2014
Сообщений: 7

Твою страничку локальный сервер отдает или ты просто файл открываешь в браузере (в адресной строке тогда будет file://) ?
Ответить с цитированием
  #3 (permalink)  
Старый 28.05.2014, 01:20
Новичок на форуме
Отправить личное сообщение для silentHill Посмотреть профиль Найти все сообщения от silentHill
 
Регистрация: 28.05.2014
Сообщений: 4

файл открываю в браузере, в адресной строке - file://....
Ответить с цитированием
  #4 (permalink)  
Старый 28.05.2014, 01:41
Новичок на форуме
Отправить личное сообщение для Borys Semerenko Посмотреть профиль Найти все сообщения от Borys Semerenko
 
Регистрация: 28.05.2014
Сообщений: 7

Так не будет работать. Нужно чтобы страницу отдавал веб-сервер.

Вот простой пример, как можно сделать.
Свою страницу сохрани как page.html и положи в одной папке с файлом сервера.
Файл сервера нужно немного изменить:
var http = require('http');
var fs = require('fs');

// Читаем страницу, которую будем отдавать на запрос
var html = fs.readFileSync('page.html');

http.createServer(function (req, res) {
  
    // Если запрос к корню, отдаем страницу
    // Во всех остальный случаях (в твоем случае будет запрос на /proj1.js) возвращаем текст "Голос..." 
    if ( req.url === '/' ) {
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
        res.end( html );
    } else {
        res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
        
        var now = new Date();
        var timeStr = now.getHours()+':'+now.getMinutes()+':'+now.getSeconds();
        res.end('Голос принят ' + timeStr);
    }

}).listen(8080);


Теперь открой в браузере http://localhost:8080.
Ответить с цитированием
  #5 (permalink)  
Старый 28.05.2014, 02:39
Новичок на форуме
Отправить личное сообщение для silentHill Посмотреть профиль Найти все сообщения от silentHill
 
Регистрация: 28.05.2014
Сообщений: 4

Да, заработало.
Но если честно я подвис немного с осознанием происходящего...
Не могли бы Вы еще чуть подробнее рассказать про фрагмент кода:
if ( req.url === '/' ) {
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
        res.end( html );
    } else {
        res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
        
        var now = new Date();
        var timeStr = now.getHours()+':'+now.getMinutes()+':'+now.getSeconds();
        res.end('Голос принят ' + timeStr);
    }


Прошу прощения за навязчивость, просто только начал изучение данного материала, прочитал статью на этом сайте, решил попробовать пример, и тут сразу ошибки...

Я понял, что для того, чтобы я увидел страницу, то сервер должен ее возвращать, это записано в условии, в else записан возврат строки со временем...так так получается, что срабатывает и то, и другое?
Ответить с цитированием
  #6 (permalink)  
Старый 28.05.2014, 13:29
Новичок на форуме
Отправить личное сообщение для Borys Semerenko Посмотреть профиль Найти все сообщения от Borys Semerenko
 
Регистрация: 28.05.2014
Сообщений: 7

Когда ты в браузере открываешь http://localhost:8080 идёт запрос на сервер.
Создается объект запроса http.IncomingMessage и объект ответа http.ServerResponse:
http.createServer(function (req, res) {
  // req - http.IncomingMessage, для того чтобы получить информацию по запросу
  // res - http.ServerResponse, для того чтобы вернуть ответ
});

В объекта http.IncomingMessage есть свойство url которое содержит в себе URL по которому ты обратился.
Если ты запросил http://localhost:8080 - URL будет '/',
если http://localhost:8080/login - '/login',
если http://localhost:8080/products/update?id=10 - '/products/update?id=10'.

Мы проверяем какой URL у запроса и в зависимости от этого по разному отвечаем. Для '/' мы просто вернем html страничку:
if ( req.url === '/' ) {
  res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  res.end( html );
}

Во всех остальных случаях мы будем возвращать просто текст.
Когда ты делаешь AJAX запрос ты указываешь адрес куда нужно сделать запрос:
xhr.open('GET', 'proj1.js', true);

В твоем случае ты просто указал 'proj1.js' и браузер сам сформирует адрес. Он возьмет текущий адрес, что в адресной строке, в твоем случае это http://localhost:8080 и добавит proj1.js.
Так что твой код делает AJAX запрос на http://localhost:8080/proj1.js.
Сервер видит что запрос не на '/', а на '/proj1.js' и отдает текст.

Надеюсь я понятно расписал
Ответить с цитированием
  #7 (permalink)  
Старый 28.05.2014, 14:04
Новичок на форуме
Отправить личное сообщение для silentHill Посмотреть профиль Найти все сообщения от silentHill
 
Регистрация: 28.05.2014
Сообщений: 4

Да-да!
Спасибо Вам огромное!
Ответить с цитированием
  #8 (permalink)  
Старый 28.05.2014, 14:17
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

http://learn.javascript.ru/nodejs-screencast
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться с $(this) didfree Общие вопросы Javascript 3 03.05.2012 23:07
Помогите разобраться с Bubbling HawkOFF Элементы интерфейса 10 09.08.2011 22:43
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24